home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DOS.SWG / 0045_EXTEMD.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1994-02-03  |  7KB  |  154 lines

  1. {
  2.  RL> I would like to open 20-50 silumtaneous files (in TP 6.0 or 7.0).
  3.  
  4.  RL> Does anyone know how to accomplish this?
  5.  
  6. I use the unit below for BP7 (protected mode or real mode).
  7. }
  8.  
  9. Unit        Extend;
  10.  
  11. {-----------------------------------------------------------------------}
  12. {  Author  : Michael John Phillips                                      }
  13. {  Address : 5/5 Waddell Place                                          }
  14. {            Curtin ACT 2605                                            }
  15. {  Tel     : (06) 2811980h                                              }
  16. {  FidoNet : 3:620/243.70                                               }
  17. {-----------------------------------------------------------------------}
  18. {
  19. $lgb$
  20. v1.0   22 Apr 93 -   Initial version works in REAL-MODE or DPMI mode BP7
  21. $lge$
  22. $nokeywords$
  23. }
  24. {-----------------------------------------------------------------------}
  25. {    This unit contains routines to extend the number of files that     }
  26. {  can simultaneously be open by a program under DOS.                   }
  27. {                                                                       }
  28. {    The NON-DPMI routine was downloaded from the Borland BBS and then  }
  29. {  modified to work with TP7 and BP7.                                   }
  30. {                                                                       }
  31. {    The DPMI routine was captured in the Z3_PASCAL FidoNet echo.       }
  32. {                                                                       }
  33. {    To use these routines, make sure that your CONFIG.SYS files        }
  34. {  contains the lines FILES=255.  If you use the DOS SHARE command      }
  35. {  then make sure that you have enough memory allocated for SHARE       }
  36. {  (eg SHARE /F:7168), having SHARE too low can result in a "hardware   }
  37. {  failure" (IOResult=162) when trying to open a file.                  }
  38. {-----------------------------------------------------------------------}
  39. {    These routines extend the max. number of files that can be OPEN    }
  40. {  simultaneously from 20 to 255.  Files in DOS 2.0 or later are        }
  41. {  controlled by FILE handles.  The number of FILE handles available    }
  42. {  to application programs is controlled by the FILES environment       }
  43. {  variable stored in a CONFIG.SYS FILE.  If no FILES variable is       }
  44. {  established in a CONFIG.SYS FILE, then only 8 FILE handles are       }
  45. {  available.  However, DOS requires 5 FILE handles for its own use     }
  46. {  (controlling  devices  such  as  CON, AUX, PRN, etc).  This leaves   }
  47. {  only 3 handles for use by application programs.                      }
  48. {                                                                       }
  49. {    By specifying a value for the FILES environment variable, you can  }
  50. {  increase the number of possible FILE handles from 8 up to 20.        }
  51. {  Since DOS still requires 5, 15 are left for application programs.    }
  52. {  But you cannot normally increase the number of handles beyond 20.    }
  53. {                                                                       }
  54. {    With DOS version 3.0, a new DOS function was added to increase     }
  55. {  the number of FILE handles available.  However, the function must    }
  56. {  be called from application programs that have previously reserved    }
  57. {  space for the new FILE handles.                                      }
  58. {-----------------------------------------------------------------------}
  59. {$IFNDEF VER70 }
  60.   Should be compiled using Turbo Pascal v7.0 or Borland Pascal v7.0
  61. {$ENDIF }
  62.  
  63. Interface
  64.  
  65. Const
  66.   MAX_FILE_HANDLES = 255;
  67.  
  68.   Function ExtendHandles(Handles : Byte) : Word;
  69.  
  70. Implementation
  71.  
  72. {$IFDEF MSDOS }
  73. Uses
  74.   Dos;                                         { Dos routines - BORLAND }
  75. {$ENDIF }
  76.  
  77. {$IFDEF DPMI }
  78. Uses
  79.   Dos,                                         { Dos routines - BORLAND }
  80.   WinAPI;                              { Windows API routines - BORLAND }
  81. {$ENDIF }
  82.  
  83. Const
  84.   NO_ERROR                = $00;
  85.   ERROR_NOT_ENOUGH_MEMORY = $08;
  86.   ERROR_HARDWARE_FAILURE  = $A2;
  87.  
  88. Var
  89.   Result : Word;
  90.   Regs : Registers;
  91.  
  92. {$IFDEF MSDOS }
  93.   Function    ExtendHandles(Handles : Byte) : Word;
  94.   {---------------------------------------------------------------------}
  95.   {    This routine resizes the amount of allocated memory for a Turbo  }
  96.   {  Pascal program to allow space for new FILE handles.  In doing so,  }
  97.   {  it also resizes the heap by  adjusting the value of FreePtr, the   }
  98.   {  pointer used in FreeList management.  Since the FreeList is being  }
  99.   {  manipulated, the heap must be empty when the extend unit is        }
  100.   {  initialized.  This can be guaranteed by including extend as one    }
  101.   {  of the first units in your program's USES statement.  If any heap  }
  102.   {  has been allocated when extend initializes, the program will halt  }
  103.   {  with an error message.                                             }
  104.   {---------------------------------------------------------------------}
  105.   begin  { of ExtendHandles }
  106.     ExtendHandles := NO_ERROR;
  107.  
  108.     {-------------------------------------------------------------------}
  109.     {    Check that the number of file handles to extend to is greater  }
  110.     {  than the default number of file handles (20).                    }
  111.     {-------------------------------------------------------------------}
  112.     if Handles <= 20 then
  113.       Exit;
  114.  
  115.     {-------------------------------------------------------------------}
  116.     {    Check that the heap used by Turbo Pascal is currently empty.   }
  117.     {-------------------------------------------------------------------}
  118.     if (HeapOrg <> HeapPtr) then
  119.       begin
  120.         Writeln('Heap must be empty before Extend unit initializes');
  121.         Halt(1);
  122.       end;
  123.  
  124.     {-------------------------------------------------------------------}
  125.     {    Reduce the heap space used by Turbo Pascal.                    }
  126.     {-------------------------------------------------------------------}
  127.     HeapEnd:=ptr(Seg(HeapEnd^)-(Handles div 8 +1), Ofs(HeapEnd^));
  128.  
  129.     {-------------------------------------------------------------------}
  130.     {    Determine how much memory is allocated to the program.  BX     }
  131.     {  returns the number of paragraphs (16 bytes) used.                }
  132.     {-------------------------------------------------------------------}
  133.     with Regs do
  134.       begin
  135.         AH := $4A;
  136.         ES := PrefixSeg;
  137.         BX := $FFFF;
  138.         MsDos(Regs);
  139.       end;   { of with Regs }
  140.  
  141.     {-------------------------------------------------------------------}
  142.     {    Set the program size to the allow for new handles.             }
  143.     {-------------------------------------------------------------------}
  144.     with Regs do
  145.       begin
  146.         AH := $4A;
  147.         ES := PrefixSeg;
  148.         BX := BX - (Handles div 8 + 1);
  149.         MsDos(Regs);
  150.       end;   { of with Regs }
  151.  
  152. END;
  153. {$ENDIF}
  154. END.